/*
 * File:   partition_helper.h
 * Author: dongkai
 *
 * Created on 2009年7月5日, 上午6:20
 */

#ifndef _PARTITION_HELPER_H
#define	_PARTITION_HELPER_H

#include <vector>
#include <string>
#include <blkid/blkid.h>

namespace utility {

class Partition_Information
{
public:
    enum Type {
        FAT,
        NTFS,
        EXT2,
        EXT3,
        EXT4,
        CDFS,
        UNKNOW,
    };
    Partition_Information();
    bool operator == (Partition_Information & info);
    static Type parse_string_for_type(const char * type_str);
    static const char * parse_type_for_string(Type type);
    
    std::string name_;   // 分区名称，如:/dev/sda1
    std::string label_;     // 分区卷标
    std::string mount_point_;   // 分区挂载点位置，如：/mnt/sda1
    char    drive_;         // 分区在Windows下的盘符，如C（不一定准确）
    Type    type_;          // 分区类型
    blkid_loff_t    size_;  // 分区大小，单位字节
    std::string uuid_string;
    
private:
//    Partition_Information(Partition_Information & info);
//    Partition_Information & operator = (Partition_Information & info);
};

/** Windows分区辅助类 */
class Partition_Helper
{
public:
    typedef std::vector<Partition_Information *> Partitions;
    Partition_Helper();
    ~Partition_Helper();
    Partition_Information get_partition_information_at(size_t index) const;
    size_t get_partition_total() const;
    
private:
    // 成功返回扫描到的分区个数，失败返回-1
    int probe_for_windows_partition();
    bool    is_windows_partition(blkid_dev dev);
    blkid_loff_t get_partition_size(blkid_dev dev);
    // 获取分区的基本参数，并返回指向该分区信息的结构的内存，这块
    // 内存是动态分配的，必须手动释放
    Partition_Information * get_partition_parameters(blkid_dev dev);
    // 当所有分区基本参数收集齐时，开始分析详细信息，比如设备名与Windows盘符的映射关系等
    void	partition_information_analyze();

    Partitions partitions_;
};

}
#endif	/* _PARTITION_HELPER_H */


